From d554bfcdc686bcdd84470cef2f453300782d5caa Mon Sep 17 00:00:00 2001 From: robertlipe Date: Sun, 20 Nov 2011 00:31:52 +0000 Subject: [PATCH] Fernando Arbeiza contributes new "bend" filter, for adding turn points before and after a route vertex. --- gpsbabel/Makefile.in | 5 +- gpsbabel/bend.c | 215 ++ gpsbabel/filter_vecs.c | 6 + gpsbabel/reference/route/bend-expected.gpx | 1770 +++++++++++++++++ gpsbabel/reference/route/bend-input.gpx | 942 +++++++++ gpsbabel/testo.d/bend.test | 5 + gpsbabel/xmldoc/filters/bend.xml | 32 + .../xmldoc/filters/options/bend-distance.xml | 7 + .../xmldoc/filters/options/bend-minangle.xml | 7 + 9 files changed, 2988 insertions(+), 1 deletion(-) create mode 100644 gpsbabel/bend.c create mode 100644 gpsbabel/reference/route/bend-expected.gpx create mode 100644 gpsbabel/reference/route/bend-input.gpx create mode 100644 gpsbabel/testo.d/bend.test create mode 100644 gpsbabel/xmldoc/filters/bend.xml create mode 100644 gpsbabel/xmldoc/filters/options/bend-distance.xml create mode 100644 gpsbabel/xmldoc/filters/options/bend-minangle.xml diff --git a/gpsbabel/Makefile.in b/gpsbabel/Makefile.in index 1b90f033a..9163bf208 100644 --- a/gpsbabel/Makefile.in +++ b/gpsbabel/Makefile.in @@ -69,7 +69,7 @@ ALL_FMTS=$(MINIMAL_FMTS) gtm.o gpsutil.o pcx.o cetus.o copilot.o \ FMTS=@FMTS@ -FILTERS=position.o radius.o duplicate.o arcdist.o polygon.o smplrout.o \ +FILTERS=bend.o position.o radius.o duplicate.o arcdist.o polygon.o smplrout.o \ reverse_route.o sort.o stackfilter.o trackfilter.o discard.o \ nukedata.o interpolate.o transform.o height.o swapdata.o @@ -392,6 +392,9 @@ avltree.o: avltree.c avltree.h defs.h config.h queue.h gbtypes.h \ zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h axim_gpb.o: axim_gpb.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h +bend.o: bend.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ + zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h filterdefs.h \ + grtcirc.h bcr.o: bcr.c defs.h config.h queue.h gbtypes.h zlib/zlib.h zlib/zconf.h \ gbfile.h cet.h cet_util.h inifile.h session.h csv_util.h \ garmin_tables.h diff --git a/gpsbabel/bend.c b/gpsbabel/bend.c new file mode 100644 index 000000000..263b7ea80 --- /dev/null +++ b/gpsbabel/bend.c @@ -0,0 +1,215 @@ +/* + Add route points before and after a bend. + + Copyright (C) 2011 Fernando Arbeiza, fernando.arbeiza@gmail.com + Copyright (C) 2011 Robert Lipe, robertlipe@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#include "defs.h" +#include "filterdefs.h" + +#include "grtcirc.h" + +#include + +#define MYNAME "bend" + +#if FILTERS_ENABLED + +static char* distopt = NULL; +static char* minangleopt = NULL; + +static double maxDist; +static double minAngle; + +static queue* routes_orig = NULL; +static int routes_orig_num = 0; + +static +arglist_t bend_args[] = { + { + "distance", &distopt, "Distance to the bend in meters where the new points will be added", + "25", ARGTYPE_FLOAT, ARG_NOMINMAX + }, + { + "minangle", &minangleopt, "Minimum bend angle in degrees", "5", + ARGTYPE_FLOAT, ARG_NOMINMAX + }, + ARG_TERMINATOR +}; + +static void +bend_init(const char* args) +{ + maxDist = 0.0; + if (distopt) { + maxDist = strtod(distopt, NULL); + } + + minAngle = 0.0; + if (minangleopt) { + minAngle = strtod(minangleopt, NULL); + } + + route_backup(&routes_orig_num, &routes_orig); + route_flush_all_routes(); +} + +static waypoint* +create_wpt_dest(const waypoint* wpt_orig, double lat_orig, + double long_orig, double lat_orig_adj, double long_orig_adj) +{ + double distance = gcdist(lat_orig, long_orig, + lat_orig_adj, long_orig_adj); + distance = radtometers(distance); + if (distance <= maxDist) { + return NULL; + } + + double frac = maxDist / distance; + double lat_dest; + double long_dest; + + linepart(lat_orig, long_orig, lat_orig_adj, long_orig_adj, frac, + &lat_dest, &long_dest); + + waypoint* wpt_dest = waypt_dupe(wpt_orig); + wpt_dest->latitude = DEG(lat_dest); + wpt_dest->longitude = DEG(long_dest); + + return wpt_dest; +} + +static int +is_small_angle(double lat_orig, double long_orig, double lat_orig_prev, + double long_orig_prev, double lat_orig_next, + double long_orig_next) +{ + double heading_prev = heading_true_degrees(lat_orig, long_orig, + lat_orig_prev, long_orig_prev); + double heading_next = heading_true_degrees(lat_orig, long_orig, + lat_orig_next, long_orig_next); + + double heading_diff = heading_next - heading_prev; + + return ((abs(heading_diff - 0.0) < minAngle) + || (abs(heading_diff - 180.0) < minAngle) + || (abs(heading_diff - 360.0) < minAngle)); +} + +static void +process_route(const route_head* route_orig, route_head* route_dest) +{ + waypoint* wpt_orig_prev = NULL; + waypoint* wpt_orig = NULL; + + queue* elem, *tmp; + QUEUE_FOR_EACH(&route_orig->waypoint_list, elem, tmp) { + waypoint* wpt_orig_next = (waypoint*)elem; + + if (wpt_orig_prev == NULL) { + if (wpt_orig != NULL) { + waypoint* waypoint_dest = waypt_dupe(wpt_orig); + route_add_wpt(route_dest, waypoint_dest); + } + } else { + double lat_orig = RAD(wpt_orig->latitude); + double long_orig = RAD(wpt_orig->longitude); + + double lat_orig_prev = RAD(wpt_orig_prev->latitude); + double long_orig_prev = RAD(wpt_orig_prev->longitude); + + double lat_orig_next = RAD(wpt_orig_next->latitude); + double long_orig_next = RAD(wpt_orig_next->longitude); + + if (is_small_angle(lat_orig, long_orig, lat_orig_prev, + long_orig_prev, lat_orig_next, long_orig_next)) { + waypoint* waypoint_dest = waypt_dupe(wpt_orig); + route_add_wpt(route_dest, waypoint_dest); + } else { + waypoint* wpt_dest_prev = create_wpt_dest(wpt_orig, + lat_orig, long_orig, lat_orig_prev, long_orig_prev); + if (wpt_dest_prev != NULL) { + route_add_wpt(route_dest, wpt_dest_prev); + } + + waypoint* wpt_dest_next = create_wpt_dest(wpt_orig, + lat_orig, long_orig, lat_orig_next, long_orig_next); + if (wpt_dest_next != NULL) { + route_add_wpt(route_dest, wpt_dest_next); + + wpt_orig = wpt_dest_next; + } + } + } + + wpt_orig_prev = wpt_orig; + wpt_orig = wpt_orig_next; + } + + if (wpt_orig != NULL) { + waypoint* waypoint_dest = waypt_dupe(wpt_orig); + route_add_wpt(route_dest, waypoint_dest); + } +} + +static void +process_route_orig(const route_head* route_orig) +{ + route_head* route_dest = route_head_alloc(); + route_dest->rte_name = xstrdup(route_orig->rte_name); + route_dest->rte_desc = xstrdup(route_orig->rte_desc); + route_dest->fs = fs_chain_copy(route_orig->fs); + route_dest->rte_num = route_orig->rte_num; + + route_add_head(route_dest); + + process_route(route_orig, route_dest); +} + +static void +bend_process(void) +{ + queue* elem, *tmp; + QUEUE_FOR_EACH(routes_orig, elem, tmp) { + route_head* route_orig = (route_head*)elem; + process_route_orig(route_orig); + } +} + +static void +bend_deinit(void) +{ + route_flush(routes_orig); + xfree(routes_orig); +} + +static void +bend_exit(void) +{ +} + +filter_vecs_t bend_vecs = { + bend_init, + bend_process, + bend_deinit, + bend_exit, + bend_args +}; + +#endif // FILTERS_ENABLED diff --git a/gpsbabel/filter_vecs.c b/gpsbabel/filter_vecs.c index 1c8bf9944..41971eb76 100644 --- a/gpsbabel/filter_vecs.c +++ b/gpsbabel/filter_vecs.c @@ -30,6 +30,7 @@ typedef struct { const char* desc; } fl_vecs_t; +extern filter_vecs_t bend_vecs; extern filter_vecs_t position_vecs; extern filter_vecs_t radius_vecs; extern filter_vecs_t duplicate_vecs; @@ -55,6 +56,11 @@ fl_vecs_t filter_vec_list[] = { "arc", "Include Only Points Within Distance of Arc", }, + { + &bend_vecs, + "bend", + "Add points before and after bends in routes" + }, { &discard_vecs, "discard", diff --git a/gpsbabel/reference/route/bend-expected.gpx b/gpsbabel/reference/route/bend-expected.gpx new file mode 100644 index 000000000..f8e7f9075 --- /dev/null +++ b/gpsbabel/reference/route/bend-expected.gpx @@ -0,0 +1,1770 @@ + + + + + + santander + Generated from track santander + + 34.733154 + RPT001 + + + 34.252441 + RPT002 + + + 34.252441 + RPT002 + + + 31.368530 + RPT003 + + + 31.368530 + RPT003 + + + 28.965332 + RPT004 + + + 24.158569 + RPT005 + + + 24.158569 + RPT005 + + + 22.235962 + RPT006 + + + 22.235962 + RPT006 + + + 29.926514 + RPT007 + + + 29.926514 + RPT007 + + + 37.616943 + RPT008 + + + 37.616943 + RPT008 + + + 56.843140 + RPT009 + + + 56.843140 + RPT009 + + + 52.997925 + RPT010 + + + 52.997925 + RPT010 + + + 52.997925 + RPT011 + + + 52.997925 + RPT011 + + + 43.384766 + RPT012 + + + 43.384766 + RPT012 + + + 29.926514 + RPT013 + + + 29.926514 + RPT013 + + + 20.794067 + RPT014 + + + 20.794067 + RPT014 + + + 19.832764 + RPT015 + + + 19.832764 + RPT015 + + + 15.506958 + RPT016 + + + 15.506958 + RPT016 + + + 15.026245 + RPT017 + + + 15.026245 + RPT017 + + + 11.661621 + RPT018 + + + 11.661621 + RPT018 + + + 11.180908 + RPT019 + + + 11.180908 + RPT019 + + + 11.661621 + RPT020 + + + 11.661621 + RPT020 + + + 7.816406 + RPT021 + + + 7.816406 + RPT021 + + + 14.545532 + RPT022 + + + 14.545532 + RPT022 + + + 17.429565 + RPT023 + + + 17.429565 + RPT023 + + + 16.468140 + RPT024 + + + 16.468140 + RPT024 + + + 19.352173 + RPT025 + + + 19.352173 + RPT025 + + + 17.910156 + RPT026 + + + 17.910156 + RPT026 + + + 26.081177 + RPT027 + + + 26.081177 + RPT027 + + + 27.523193 + RPT028 + + + 27.523193 + RPT028 + + + 28.965332 + RPT029 + + + 28.965332 + RPT029 + + + 36.175049 + RPT030 + + + 36.175049 + RPT030 + + + 40.500977 + RPT031 + + + 40.500977 + RPT031 + + + 51.075317 + RPT032 + + + 51.075317 + RPT032 + + + 49.152710 + RPT033 + + + 49.152710 + RPT033 + + + 52.036743 + RPT034 + + + 52.036743 + RPT034 + + + 56.843140 + RPT035 + + + 56.843140 + RPT035 + + + 59.246460 + RPT036 + + + 59.246460 + RPT036 + + + 58.765747 + RPT037 + + + 58.765747 + RPT037 + + + 62.611084 + RPT038 + + + 62.611084 + RPT038 + + + 65.014404 + RPT039 + + + 65.014404 + RPT039 + + + 65.014404 + RPT040 + + + 65.014404 + RPT040 + + + 67.417725 + RPT041 + + + 67.417725 + RPT041 + + + 62.130493 + RPT042 + + + 62.130493 + RPT042 + + + 64.533691 + RPT043 + + + 64.533691 + RPT043 + + + 66.456299 + RPT044 + + + 66.456299 + RPT044 + + + 53.478638 + RPT045 + + + 53.478638 + RPT045 + + + 46.749512 + RPT046 + + + 46.749512 + RPT046 + + + 56.843140 + RPT047 + + + 56.843140 + RPT047 + + + 58.765747 + RPT048 + + + 62.611084 + RPT049 + + + 62.611084 + RPT049 + + + 60.688477 + RPT050 + + + 29.926514 + RPT051 + + + 29.926514 + RPT051 + + + 29.445923 + RPT052 + + + 29.445923 + RPT052 + + + 12.622925 + RPT053 + + + 12.622925 + RPT053 + + + 35.213745 + RPT054 + + + 35.213745 + RPT054 + + + 26.081177 + RPT055 + + + 35.694336 + RPT056 + + + 36.655762 + RPT057 + + + 36.655762 + RPT057 + + + 38.578369 + RPT058 + + + 38.578369 + RPT058 + + + 32.810547 + RPT059 + + + 32.810547 + RPT059 + + + 32.810547 + RPT060 + + + 32.810547 + RPT060 + + + 31.368530 + RPT061 + + + 31.368530 + RPT061 + + + 29.926514 + RPT062 + + + 29.926514 + RPT062 + + + 25.119995 + RPT063 + + + 25.119995 + RPT063 + + + 9.258301 + RPT064 + + + 9.258301 + RPT064 + + + 6.374390 + RPT065 + + + 6.374390 + RPT065 + + + 5.413086 + RPT066 + + + 5.413086 + RPT066 + + + 5.893799 + RPT067 + + + 5.893799 + RPT067 + + + 7.816406 + RPT068 + + + 7.816406 + RPT068 + + + 6.374390 + RPT069 + + + 6.374390 + RPT069 + + + 2.529175 + RPT070 + + + 2.529175 + RPT070 + + + 2.529175 + RPT071 + + + 2.529175 + RPT071 + + + 3.971191 + RPT072 + + + 3.971191 + RPT072 + + + 1.567871 + RPT073 + + + 1.567871 + RPT073 + + + 0.125977 + RPT074 + + + 0.125977 + RPT074 + + + 2.048584 + RPT075 + + + 2.048584 + RPT075 + + + 0.125977 + RPT076 + + + 0.125977 + RPT076 + + + 2.048584 + RPT077 + + + 2.048584 + RPT077 + + + 3.490479 + RPT078 + + + 3.971191 + RPT079 + + + 3.971191 + RPT079 + + + 4.932373 + RPT080 + + + 2.048584 + RPT081 + + + 2.048584 + RPT081 + + + 0.606567 + RPT082 + + + 0.606567 + RPT082 + + + 2.529175 + RPT083 + + + 1.567871 + RPT084 + + + 1.567871 + RPT084 + + + 2.529175 + RPT085 + + + 2.529175 + RPT085 + + + 3.971191 + RPT086 + + + 5.413086 + RPT087 + + + 5.413086 + RPT087 + + + 1.087158 + RPT088 + + + 1.087158 + RPT088 + + + 3.971191 + RPT089 + + + 12.142334 + RPT090 + + + 12.142334 + RPT090 + + + 8.296997 + RPT091 + + + 8.296997 + RPT091 + + + -0.835449 + RPT092 + + + -0.835449 + RPT092 + + + 5.413086 + RPT093 + + + 5.413086 + RPT093 + + + 25.119995 + RPT094 + + + 25.119995 + RPT094 + + + 25.119995 + RPT095 + + + 25.119995 + RPT095 + + + 23.197388 + RPT096 + + + 26.561890 + RPT097 + + + 26.561890 + RPT097 + + + 26.081177 + RPT098 + + + 26.081177 + RPT098 + + + 26.561890 + RPT099 + + + 26.561890 + RPT099 + + + 26.081177 + RPT100 + + + 26.081177 + RPT100 + + + 30.887940 + RPT101 + + + 30.887940 + RPT101 + + + 25.600586 + RPT102 + + + 25.600586 + RPT102 + + + 20.794067 + RPT103 + + + 20.794067 + RPT103 + + + 17.429565 + RPT104 + + + 17.429565 + RPT104 + + + 6.374390 + RPT105 + + + 6.374390 + RPT105 + + + 4.932373 + RPT106 + + + 4.932373 + RPT106 + + + 2.529175 + RPT107 + + + 2.529175 + RPT107 + + + 15.506958 + RPT108 + + + 15.506958 + RPT108 + + + 19.832764 + RPT109 + + + 19.832764 + RPT109 + + + 20.313354 + RPT110 + + + 11.180908 + RPT111 + + + 11.180908 + RPT111 + + + 2.048584 + RPT112 + + + 2.048584 + RPT112 + + + 6.374390 + RPT113 + + + 6.374390 + RPT113 + + + 7.335693 + RPT114 + + + 7.335693 + RPT114 + + + 11.661621 + RPT115 + + + 11.661621 + RPT115 + + + 12.142334 + RPT116 + + + 12.142334 + RPT116 + + + 15.026245 + RPT117 + + + 15.026245 + RPT117 + + + 13.584351 + RPT118 + + + 13.584351 + RPT118 + + + 10.219605 + RPT119 + + + 10.219605 + RPT119 + + + 9.258301 + RPT120 + + + 14.064941 + RPT121 + + + 14.064941 + RPT121 + + + 11.661621 + RPT122 + + + 11.661621 + RPT122 + + + 6.854980 + RPT123 + + + 6.854980 + RPT123 + + + 4.932373 + RPT124 + + + 3.971191 + RPT125 + + + 3.971191 + RPT125 + + + 5.893799 + RPT126 + + + 5.893799 + RPT126 + + + 5.413086 + RPT127 + + + 5.413086 + RPT127 + + + 22.716675 + RPT128 + + + 22.716675 + RPT128 + + + 38.578369 + RPT129 + + + 38.578369 + RPT129 + + + 58.765747 + RPT130 + + + 58.765747 + RPT130 + + + 66.456299 + RPT131 + + + 66.456299 + RPT131 + + + 62.611084 + RPT132 + + + 62.611084 + RPT132 + + + 64.053101 + RPT133 + + + 64.053101 + RPT133 + + + 65.975708 + RPT134 + + + 65.975708 + RPT134 + + + 66.456299 + RPT135 + + + 66.456299 + RPT135 + + + 61.169190 + RPT136 + + + 61.169190 + RPT136 + + + 62.611084 + RPT137 + + + 62.611084 + RPT137 + + + 61.649902 + RPT138 + + + 61.649902 + RPT138 + + + 46.268921 + RPT139 + + + 46.268921 + RPT139 + + + 36.175049 + RPT140 + + + 36.175049 + RPT140 + + + 18.390747 + RPT141 + + + 18.390747 + RPT141 + + + 10.219605 + RPT142 + + + 18.390747 + RPT143 + + + 18.390747 + RPT143 + + + 37.136353 + RPT144 + + + 37.136353 + RPT144 + + + 31.368530 + RPT145 + + + 31.368530 + RPT145 + + + 4.932373 + RPT146 + + + 13.584351 + RPT147 + + + 13.584351 + RPT147 + + + 24.639282 + RPT148 + + + 24.639282 + RPT148 + + + 27.523193 + RPT149 + + + 27.523193 + RPT149 + + + 22.716675 + RPT150 + + + 22.716675 + RPT150 + + + 45.307495 + RPT151 + + + 45.307495 + RPT151 + + + 26.561890 + RPT152 + + + 26.561890 + RPT152 + + + 34.733154 + RPT153 + + + 34.733154 + RPT153 + + + 26.561890 + RPT154 + + + 26.561890 + RPT154 + + + 34.252441 + RPT155 + + + 34.252441 + RPT155 + + + 28.965332 + RPT156 + + + 28.965332 + RPT156 + + + 24.158569 + RPT157 + + + 24.158569 + RPT157 + + + 23.197388 + RPT158 + + + 23.197388 + RPT158 + + + 21.755371 + RPT159 + + + 21.755371 + RPT160 + + + 23.197388 + RPT161 + + + 23.197388 + RPT161 + + + 9.739014 + RPT162 + + + 9.739014 + RPT162 + + + 11.180908 + RPT163 + + + 11.180908 + RPT163 + + + 12.622925 + RPT164 + + + 12.622925 + RPT164 + + + 22.235962 + RPT165 + + + 22.235962 + RPT165 + + + 38.097656 + RPT166 + + + 38.097656 + RPT166 + + + 24.639282 + RPT167 + + + 24.639282 + RPT167 + + + 16.948853 + RPT168 + + + 16.948853 + RPT168 + + + 19.832764 + RPT169 + + + 19.832764 + RPT169 + + + 3.009766 + RPT170 + + + 18.871460 + RPT171 + + + 18.871460 + RPT171 + + + 15.506958 + RPT172 + + + 15.506958 + RPT172 + + + 23.677978 + RPT173 + + + 23.677978 + RPT173 + + + 36.655762 + RPT174 + + + 36.655762 + RPT174 + + + 39.539551 + RPT175 + + + 40.500977 + RPT176 + + + 40.500977 + RPT176 + + + 46.268921 + RPT177 + + + 46.268921 + RPT177 + + + 55.709473 + RPT178 + + + 55.709473 + RPT178 + + + 70.709473 + RPT179 + + + 70.709473 + RPT179 + + + 75.709473 + RPT180 + + + 90.267456 + RPT181 + + + 90.267456 + RPT181 + + + 95.963867 + RPT182 + + + 95.963867 + RPT182 + + + 100.102295 + RPT183 + + + 100.102295 + RPT183 + + + 93.373047 + RPT184 + + + 93.373047 + RPT184 + + + 90.969727 + RPT185 + + + 90.969727 + RPT185 + + + 88.085815 + RPT186 + + + 88.085815 + RPT186 + + + 87.605103 + RPT187 + + + 87.605103 + RPT187 + + + 102.986084 + RPT188 + + + 102.986084 + RPT188 + + + 126.057617 + RPT189 + + + 126.057617 + RPT189 + + + 144.803223 + RPT190 + + + 144.803223 + RPT190 + + + 180.371704 + RPT191 + + + 180.371704 + RPT191 + + + 191.426758 + RPT192 + + + 191.426758 + RPT192 + + + 197.194580 + RPT193 + + + 210.652954 + RPT194 + + + 210.652954 + RPT194 + + + 231.801758 + RPT195 + + + 208.730347 + RPT196 + + + 208.730347 + RPT196 + + + 195.271973 + RPT197 + + + 195.271973 + RPT197 + + + 187.100830 + RPT198 + + + 187.100830 + RPT198 + + + 155.377564 + RPT199 + + + 155.377564 + RPT199 + + + 148.167847 + RPT200 + + + 148.167847 + RPT200 + + + 183.736206 + RPT201 + + + 183.736206 + RPT201 + + + 200.078613 + RPT202 + + + 200.078613 + RPT202 + + + 208.730347 + RPT203 + + + 208.730347 + RPT203 + + + 221.227539 + RPT204 + + + 221.227539 + RPT204 + + + 235.166382 + RPT205 + + + 235.166382 + RPT205 + + + 226.033936 + RPT206 + + + 226.033936 + RPT206 + + + 201.520508 + RPT207 + + + 201.520508 + RPT207 + + + 188.542969 + RPT208 + + + 188.542969 + RPT208 + + + 144.803223 + RPT209 + + + 144.803223 + RPT209 + + + 141.919311 + RPT210 + + + 141.919311 + RPT210 + + + 136.151367 + RPT211 + + + 136.151367 + RPT211 + + + 110.196045 + RPT212 + + + 110.196045 + RPT212 + + + 86.163208 + RPT213 + + + 86.163208 + RPT213 + + + 75.588745 + RPT214 + + + 75.588745 + RPT214 + + + 71.262940 + RPT215 + + + 71.262940 + RPT215 + + + 66.937012 + RPT216 + + + 66.937012 + RPT216 + + + 63.091797 + RPT217 + + + 63.091797 + RPT217 + + + 61.649902 + RPT218 + + + 61.649902 + RPT218 + + + 59.727173 + RPT219 + + + 59.727173 + RPT219 + + + 55.881958 + RPT220 + + + 55.881958 + RPT220 + + + 53.478638 + RPT221 + + + 53.478638 + RPT221 + + + 55.401245 + RPT222 + + + 55.401245 + RPT222 + + + 52.036743 + RPT223 + + + 52.036743 + RPT223 + + + 49.152710 + RPT224 + + + 49.152710 + RPT224 + + + 46.749512 + RPT225 + + + 46.749512 + RPT225 + + + 48.672119 + RPT226 + + + 48.672119 + RPT226 + + + 44.826904 + RPT227 + + + 44.826904 + RPT227 + + + 44.826904 + RPT228 + + + 44.826904 + RPT228 + + + 44.346314 + RPT229 + + + 44.346314 + RPT229 + + + 45.307495 + RPT230 + + + 45.307495 + RPT230 + + + 42.904175 + RPT231 + + + 42.904175 + RPT231 + + + 33.771729 + RPT232 + + + diff --git a/gpsbabel/reference/route/bend-input.gpx b/gpsbabel/reference/route/bend-input.gpx new file mode 100644 index 000000000..5512d6e8b --- /dev/null +++ b/gpsbabel/reference/route/bend-input.gpx @@ -0,0 +1,942 @@ + + + + + + santander + Generated from track santander + + 34.733154 + RPT001 + + + 34.252441 + RPT002 + + + 31.368530 + RPT003 + + + 28.965332 + RPT004 + + + 24.158569 + RPT005 + + + 22.235962 + RPT006 + + + 29.926514 + RPT007 + + + 37.616943 + RPT008 + + + 56.843140 + RPT009 + + + 52.997925 + RPT010 + + + 52.997925 + RPT011 + + + 43.384766 + RPT012 + + + 29.926514 + RPT013 + + + 20.794067 + RPT014 + + + 19.832764 + RPT015 + + + 15.506958 + RPT016 + + + 15.026245 + RPT017 + + + 11.661621 + RPT018 + + + 11.180908 + RPT019 + + + 11.661621 + RPT020 + + + 7.816406 + RPT021 + + + 14.545532 + RPT022 + + + 17.429565 + RPT023 + + + 16.468140 + RPT024 + + + 19.352173 + RPT025 + + + 17.910156 + RPT026 + + + 26.081177 + RPT027 + + + 27.523193 + RPT028 + + + 28.965332 + RPT029 + + + 36.175049 + RPT030 + + + 40.500977 + RPT031 + + + 51.075317 + RPT032 + + + 49.152710 + RPT033 + + + 52.036743 + RPT034 + + + 56.843140 + RPT035 + + + 59.246460 + RPT036 + + + 58.765747 + RPT037 + + + 62.611084 + RPT038 + + + 65.014404 + RPT039 + + + 65.014404 + RPT040 + + + 67.417725 + RPT041 + + + 62.130493 + RPT042 + + + 64.533691 + RPT043 + + + 66.456299 + RPT044 + + + 53.478638 + RPT045 + + + 46.749512 + RPT046 + + + 56.843140 + RPT047 + + + 58.765747 + RPT048 + + + 62.611084 + RPT049 + + + 60.688477 + RPT050 + + + 29.926514 + RPT051 + + + 29.445923 + RPT052 + + + 12.622925 + RPT053 + + + 35.213745 + RPT054 + + + 26.081177 + RPT055 + + + 35.694336 + RPT056 + + + 36.655762 + RPT057 + + + 38.578369 + RPT058 + + + 32.810547 + RPT059 + + + 32.810547 + RPT060 + + + 31.368530 + RPT061 + + + 29.926514 + RPT062 + + + 25.119995 + RPT063 + + + 9.258301 + RPT064 + + + 6.374390 + RPT065 + + + 5.413086 + RPT066 + + + 5.893799 + RPT067 + + + 7.816406 + RPT068 + + + 6.374390 + RPT069 + + + 2.529175 + RPT070 + + + 2.529175 + RPT071 + + + 3.971191 + RPT072 + + + 1.567871 + RPT073 + + + 0.125977 + RPT074 + + + 2.048584 + RPT075 + + + 0.125977 + RPT076 + + + 2.048584 + RPT077 + + + 3.490479 + RPT078 + + + 3.971191 + RPT079 + + + 4.932373 + RPT080 + + + 2.048584 + RPT081 + + + 0.606567 + RPT082 + + + 2.529175 + RPT083 + + + 1.567871 + RPT084 + + + 2.529175 + RPT085 + + + 3.971191 + RPT086 + + + 5.413086 + RPT087 + + + 1.087158 + RPT088 + + + 3.971191 + RPT089 + + + 12.142334 + RPT090 + + + 8.296997 + RPT091 + + + -0.835449 + RPT092 + + + 5.413086 + RPT093 + + + 25.119995 + RPT094 + + + 25.119995 + RPT095 + + + 23.197388 + RPT096 + + + 26.561890 + RPT097 + + + 26.081177 + RPT098 + + + 26.561890 + RPT099 + + + 26.081177 + RPT100 + + + 30.887940 + RPT101 + + + 25.600586 + RPT102 + + + 20.794067 + RPT103 + + + 17.429565 + RPT104 + + + 6.374390 + RPT105 + + + 4.932373 + RPT106 + + + 2.529175 + RPT107 + + + 15.506958 + RPT108 + + + 19.832764 + RPT109 + + + 20.313354 + RPT110 + + + 11.180908 + RPT111 + + + 2.048584 + RPT112 + + + 6.374390 + RPT113 + + + 7.335693 + RPT114 + + + 11.661621 + RPT115 + + + 12.142334 + RPT116 + + + 15.026245 + RPT117 + + + 13.584351 + RPT118 + + + 10.219605 + RPT119 + + + 9.258301 + RPT120 + + + 14.064941 + RPT121 + + + 11.661621 + RPT122 + + + 6.854980 + RPT123 + + + 4.932373 + RPT124 + + + 3.971191 + RPT125 + + + 5.893799 + RPT126 + + + 5.413086 + RPT127 + + + 22.716675 + RPT128 + + + 38.578369 + RPT129 + + + 58.765747 + RPT130 + + + 66.456299 + RPT131 + + + 62.611084 + RPT132 + + + 64.053101 + RPT133 + + + 65.975708 + RPT134 + + + 66.456299 + RPT135 + + + 61.169190 + RPT136 + + + 62.611084 + RPT137 + + + 61.649902 + RPT138 + + + 46.268921 + RPT139 + + + 36.175049 + RPT140 + + + 18.390747 + RPT141 + + + 10.219605 + RPT142 + + + 18.390747 + RPT143 + + + 37.136353 + RPT144 + + + 31.368530 + RPT145 + + + 4.932373 + RPT146 + + + 13.584351 + RPT147 + + + 24.639282 + RPT148 + + + 27.523193 + RPT149 + + + 22.716675 + RPT150 + + + 45.307495 + RPT151 + + + 26.561890 + RPT152 + + + 34.733154 + RPT153 + + + 26.561890 + RPT154 + + + 34.252441 + RPT155 + + + 28.965332 + RPT156 + + + 24.158569 + RPT157 + + + 23.197388 + RPT158 + + + 21.755371 + RPT159 + + + 21.755371 + RPT160 + + + 23.197388 + RPT161 + + + 9.739014 + RPT162 + + + 11.180908 + RPT163 + + + 12.622925 + RPT164 + + + 22.235962 + RPT165 + + + 38.097656 + RPT166 + + + 24.639282 + RPT167 + + + 16.948853 + RPT168 + + + 19.832764 + RPT169 + + + 3.009766 + RPT170 + + + 18.871460 + RPT171 + + + 15.506958 + RPT172 + + + 23.677978 + RPT173 + + + 36.655762 + RPT174 + + + 39.539551 + RPT175 + + + 40.500977 + RPT176 + + + 46.268921 + RPT177 + + + 55.709473 + RPT178 + + + 70.709473 + RPT179 + + + 75.709473 + RPT180 + + + 90.267456 + RPT181 + + + 95.963867 + RPT182 + + + 100.102295 + RPT183 + + + 93.373047 + RPT184 + + + 90.969727 + RPT185 + + + 88.085815 + RPT186 + + + 87.605103 + RPT187 + + + 102.986084 + RPT188 + + + 126.057617 + RPT189 + + + 144.803223 + RPT190 + + + 180.371704 + RPT191 + + + 191.426758 + RPT192 + + + 197.194580 + RPT193 + + + 210.652954 + RPT194 + + + 231.801758 + RPT195 + + + 208.730347 + RPT196 + + + 195.271973 + RPT197 + + + 187.100830 + RPT198 + + + 155.377564 + RPT199 + + + 148.167847 + RPT200 + + + 183.736206 + RPT201 + + + 200.078613 + RPT202 + + + 208.730347 + RPT203 + + + 221.227539 + RPT204 + + + 235.166382 + RPT205 + + + 226.033936 + RPT206 + + + 201.520508 + RPT207 + + + 188.542969 + RPT208 + + + 144.803223 + RPT209 + + + 141.919311 + RPT210 + + + 136.151367 + RPT211 + + + 110.196045 + RPT212 + + + 86.163208 + RPT213 + + + 75.588745 + RPT214 + + + 71.262940 + RPT215 + + + 66.937012 + RPT216 + + + 63.091797 + RPT217 + + + 61.649902 + RPT218 + + + 59.727173 + RPT219 + + + 55.881958 + RPT220 + + + 53.478638 + RPT221 + + + 55.401245 + RPT222 + + + 52.036743 + RPT223 + + + 49.152710 + RPT224 + + + 46.749512 + RPT225 + + + 48.672119 + RPT226 + + + 44.826904 + RPT227 + + + 44.826904 + RPT228 + + + 44.346314 + RPT229 + + + 45.307495 + RPT230 + + + 42.904175 + RPT231 + + + 33.771729 + RPT232 + + + diff --git a/gpsbabel/testo.d/bend.test b/gpsbabel/testo.d/bend.test new file mode 100644 index 000000000..843376e85 --- /dev/null +++ b/gpsbabel/testo.d/bend.test @@ -0,0 +1,5 @@ +rm -f ${TMPDIR}/bend.* + + +gpsbabel -i gpx -f ${REFERENCE}/route/bend-input.gpx -x bend,distance=25,interpolate,minangle=5 -o gpx -F ${TMPDIR}/bend.gpx +compare ${REFERENCE}/route/bend-expected.gpx ${TMPDIR}/bend.gpx diff --git a/gpsbabel/xmldoc/filters/bend.xml b/gpsbabel/xmldoc/filters/bend.xml new file mode 100644 index 000000000..6df2bc822 --- /dev/null +++ b/gpsbabel/xmldoc/filters/bend.xml @@ -0,0 +1,32 @@ +The bend filter modifies each route replacing each point inside a +curve with two points: one at a given distance in the direction of the +previous point, and another at the same distance in the direction of +the next point in the route. It only replaces points where there is a +change in heading big enough. + +When creating a route, points are usually created inside curves or +intersections. That means that, while navigating that route using a +GPS unit, the course pointer would aim to the inside of that curve or +intersection, and only when you have passed that point will the GPS +aim to the next waypoint in the route. This behaviour is useful in +marine navigation but when biking, for instance, it may be a bit late +to decide where to turn to in an intersection. + +This filter tries to solve that creating a waypoint before and after +where there is a change in direction.That way, the course pointer will +point to the direction you should turn to ahead in time. + +For this filter to work correctly, the route should be simple enough +that there is only one waypoint inside each curve or intersection. +Because of that, it is usually a good idea to use the simplify filter +before this one. + +This command line reads route.gpx and replaces each point with other two +points: one 25 metres before and another 25 metres after the original +point. It replaces a point only if there is a change of direction +larger than 5 degrees. + +gpsbabel -i gpx -f route.gpx -x +bend,distance=25,interpolate,minangle=5 -o gpx -F newroute.gpx + + diff --git a/gpsbabel/xmldoc/filters/options/bend-distance.xml b/gpsbabel/xmldoc/filters/options/bend-distance.xml new file mode 100644 index 000000000..a1342200d --- /dev/null +++ b/gpsbabel/xmldoc/filters/options/bend-distance.xml @@ -0,0 +1,7 @@ +Distance in meters to the original point where the new points will be added. + +The new points will be created at this distance. The first one in the +direction of the previous point, ant the second one in the direction +of the next point in the route. + + diff --git a/gpsbabel/xmldoc/filters/options/bend-minangle.xml b/gpsbabel/xmldoc/filters/options/bend-minangle.xml new file mode 100644 index 000000000..824cc1e63 --- /dev/null +++ b/gpsbabel/xmldoc/filters/options/bend-minangle.xml @@ -0,0 +1,7 @@ +Minimum curve angle in degrees. + +The substitution will only be made if the change in the heading is +greater than this value. This avoids replacing a point if the GPS unit +is already pointing in the correct direction, or if the route reaches +a certain point and goes back the same road. + -- 2.30.2